//
// Created by hsj on 2022/1/18.
//

#ifndef CLION_CPP_T_CLASS_EXTEND_VIRTUAL_H
#define CLION_CPP_T_CLASS_EXTEND_VIRTUAL_H
#include <string>
namespace hsj_class_extend_virtual{
    using std::cout;
    using std::endl;
    using std::string;
    //精度相关
    typedef std::ios_base::fmtflags format;
    typedef std::streamsize precis;
    //设置新的，返回原始的
    format setFormat();
    //使用原始的重置
    void reStore(format f,precis p);

    //需要被多态使用
    //C++的virtual目的就是达到java多态一样的效果
    void test_class_extend_virtual();

    //基类
    class Brass{
        private:
            string fullName;
            long acctNum;
            double balance;
        public:
            Brass(const string &fn = "NullBody",long an = -1,double bal = 0.0);
            void deposit(double amt);//存款
            //需要被多态使用
            //C++的virtual目的就是达到java多态一样的效果
            virtual void withDraw(double amt);//支出
            virtual void viewAcct()const;//查看
            void viewName()const;

            double Balance()const;//余额
            virtual ~Brass(){
                cout<<"Brass::~"<<endl;
            };//析构函数-派生类时候自动调用派生类的析构函数
    };

    //子类
    class BrassPlus: public Brass{
        private:
            double maxLoan;//借款
            double rate;//利率
            double owesBank;//欠(债)
        public:
            BrassPlus(const string &fn = "NullBody",long an = -1,double bal = 0.0,double ml = 500,double r = 0.11125);
            BrassPlus(const Brass &b,double ml = 500,double r = 0.11125);
            //需要被多态使用
            //C++的virtual目的就是达到java多态一样的效果
            virtual void withDraw(double amt);//支出
            virtual void viewAcct()const;//查看
            void viewName()const;

            void ResetMax(double m){maxLoan = m;};
            void ResetRate(double r){rate = r;};
            void ResetOwes(){owesBank = 0.0;};

            virtual ~BrassPlus(){
                cout<<"BrassPlus::~"<<endl;
            };//析构函数-派生类时候自动调用派生类的析构函数
    };
}
#endif //CLION_CPP_T_CLASS_EXTEND_VIRTUAL_H
